package com.xiafei.onenet;

import com.google.gson.JsonObject;
import com.xiafei.onenet.common.Http;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static com.xiafei.onenet.common.Constant.*;

public class HttpApiTest {

    private static final String MasterKey = "JVOigQxVvarl4pMYlBK38pZA2YM=";
    private static final String API_KEY = "api-key";

    private static final String CONTENT_TYPE_kEY = "Content-Type";
    private static final String CONTENT_TYPE_VALUE = "application/json";

    public static Map POST_HEADER() {
        Map<String, String> header = new HashMap<>();
        header.put(API_KEY, MasterKey);
        header.put(CONTENT_TYPE_kEY, CONTENT_TYPE_VALUE);
        return header;
    }

    public static Map GET_HEADER() {
        Map<String, String> header = new HashMap<>();
        header.put(API_KEY, MasterKey);
        return header;
    }

    /**
     * 添加设备
     */
    public static void devices() {

        Map<String, Object> body = new HashMap<>();

        //设备名
        body.put("title", "fly");

        //设备描述（可选）
        body.put("desc", "triple fly");

        //设备标签（可选，可为一个或多个）
        body.put("tags", new String[]{"triple", "fly"});

        //接入协议
        body.put("protocol", "LWM2M");

        //设备位置{"纬度", "精度", "高度"}（可选）
        JsonObject location = new JsonObject();
        location.addProperty("lon", 106);
        location.addProperty("lat", 29);
        location.addProperty("ele", 370);
        body.put("location", location);

        //设备私密性
        body.put("private", false);

        //NBIOT设备
        Map<String, Object> auth_info = new HashMap<>();
        auth_info.put("865820030038234", "460040167009025");
        body.put("auth_info", auth_info);

        //是否订阅设备资源，默认为true
        body.put("obsv", true);

        //其他信息（可选，JSON格式，可自定义）
        JsonObject other = new JsonObject();
        location.addProperty("version", "1.0.0");
        location.addProperty("manu", "china mobile");
        body.put("other", other);

        String result = Http.POST(DEVICES.getUrl(), POST_HEADER(), null, body);
        System.out.println(result);
    }

    /**
     * 读设备资源
     */
    public static void nbiot_read() {
        Map<String, Object> params = new HashMap<>();
        // nbiot设备的身份码，和ep_name两者必填其一
        params.put("imei", "865820030038234");

        // nbiot设备的身份码，和imei两者必填其一
        params.put("ep_name", "121");

        // 设备的object id , 对应到平台模型中为数据流id，必填
        params.put("obj_id", "28327538");

        // nbiot设备object下具体一个instance的id ，对应到平台模型中数据点key值的一部分，选填
        params.put("obj_inst_id", "121");

        // nbiot设备的资源id，选填
        params.put("res_id", "121");

        String result = Http.GET(NBIOT.getUrl(), GET_HEADER(), params);
        System.out.println(result);
    }

    /**
     * 写设备资源
     */
    public static void nbiot_write() {
        Map<String, Object> params = new HashMap<>();
        // nbiot设备的身份码，和ep_name两者必填其一
        params.put("imei", "865820030038234");
        // nbiot设备的身份码，和imei两者必填其一
        params.put("ep_name", "121");
        // 设备的object id , 对应到平台模型中为数据流id，必填
        params.put("obj_id", "28327538");
        // nbiot设备object下具体一个instance的id ，对应到平台模型中数据点key值的一部分，选填
        params.put("obj_inst_id", "121");
        // // write的模式，必填 1|2
        params.put("mode", 1);

        Map<String, Object> data = new HashMap<>();
        data.put("res_id", "123");
        // 可选，目前只支持为1，此时数据为十六进制字符串
        data.put("type", "1");
        //可为boolean、string、long、double
        data.put("val", false);

        List<Map> body = new ArrayList<>();
        body.add(data);

        String result = Http.POST(NBIOT.getUrl(), POST_HEADER(), params, body);
        System.out.println(result);
    }

    /**
     * 下发指令
     */
    public static void execute() {
        Map<String, Object> params = new HashMap<>();
        // nbiot设备的身份码，和ep_name两者必填其一
        params.put("imei", "865820030038234");

        // nbiot设备的身份码，和imei两者必填其一
        params.put("ep_name", "121");

        // 设备的object id , 对应到平台模型中为数据流id，必填
        params.put("obj_id", "28327538");

        // nbiot设备object下具体一个instance的id ，对应到平台模型中数据点key值的一部分，选填
        params.put("obj_inst_id", "121");

        // nbiot设备的资源id，选填
        params.put("res_id", "121");

        Map<String, Object> body = new HashMap<>();
        body.put("args", "abc");

        String result = Http.POST(EXECUTE.getUrl(), POST_HEADER(), params, body);
        System.out.println(result);
    }


    /**
     * 获取资源列表
     */
    public static void resources() {
        Map<String, Object> params = new HashMap<>();

        // nbiot设备的身份码，和ep_name两者必填其一
        params.put("imei", "865820030038234");

        // 设备的object id , 对应到平台模型中为数据流id，必填
        params.put("obj_id", "28327538");

        String result = Http.GET(RESOURCES.getUrl(), GET_HEADER(), params);
        System.out.println(result);
    }


    /**
     * 订阅
     */
    public static void observe() {
        Map<String, Object> params = new HashMap<>();
        // nbiot设备的身份码，和ep_name两者必填其一
        params.put("imei", "865820030038234");
        //true为取消订阅，false为订阅，必填；
        params.put("cancel", false);
        // 设备的object id , 对应到平台模型中为数据流id，必填
        params.put("obj_id", "28327538");
        // nbiot设备object下具体一个instance的id ，对应到平台模型中数据点key值的一部分，选填
        params.put("obj_inst_id", "121");
        // nbiot设备的资源id，选填
        params.put("res_id", "121");
        //传数据的最小时间间隔 int类型，可选；
        params.put("pmin", 3);
        //上传数据的最大时间间隔 int类型，可选；
        params.put("pmax", 3);
        //当数据第一次大于该值上传，double类型，可选；
        params.put("gl", 3);
        //当数据第一次小于该值上传，double类型，可选；
        params.put("lt", 5);
        //当前数据与前一次数据相差大于或者等于该值上传，double类型，可选
        params.put("st", 2);


        Map<String, Object> body = new HashMap<>();
        body.put("", "");

        String result = Http.POST(OBSERVE.getUrl(), POST_HEADER(), params, body);
        System.out.println(result);
    }


    /**
     * 查看数据点
     */
    public static void datapoints() {
        Map<String, Object> params = new HashMap<>();
        params.put("datastream_id", "");
        params.put("start", "2018-01-10T08:00:35");
        params.put("end", "2018-05-10T08:00:35");
        params.put("limit", 1000);
//        params.put("cursor", "");

        String obj_id = "28327538";
        String result = Http.GET(DATAPOINTS.getUrl(obj_id), GET_HEADER(), params);
        System.out.println(result);
    }


    public static void main(String[] args) {
//        devices();
//        nbiot_read();
//        nbiot_write();
        datapoints();
    }

}
